/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package ec.edu.ups.cidi.siia.plamdep.desktop.gui;

import java.awt.Container;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import ec.edu.ups.cidi.siia.plamdep.configuracion.ConfiguracionGlobal;
import ec.edu.ups.cidi.siia.plamdep.ejecutor.Ejecutor;
import ec.edu.ups.cidi.siia.plamdep.ejecutor.GestionAlgoritmos.AlgComparacionContainer;
import ec.edu.ups.cidi.siia.plamdep.ejecutor.GestionAlgoritmos.AlgExtractorContainer;
import ec.edu.ups.cidi.siia.plamdep.interfaces.ListenerLogguer;
import ec.edu.ups.cidi.siia.plamdep.modelo.algortimos.ResultAnalisis;
import ec.edu.ups.cidi.siia.plamdep.modelo.algortimos.ResultAnalisisFinal;
import ec.edu.ups.cidi.siia.plamdep.modelo.algortimos.SolicitudAnalisisJMS;
import ec.edu.ups.cidi.siia.plamdep.modelo.reporte.ReporteCabecera;
import ec.edu.ups.cidi.siia.plamdep.modelo.reporte.ReporteData;
import ec.edu.ups.cidi.siia.plamdep.modelo.reporte.ReporteDetalle;
import ec.edu.ups.cidi.siia.plamdep.modelo.webcrawler.Pagina;
import ec.edu.ups.cidi.siia.plamdep.utils.ArchivosManager;
import ec.edu.ups.cidi.siia.plamdep.utils.Fechas;
import ec.edu.ups.cidi.siia.plamdep.utils.ReportesManager;
import ec.edu.ups.cidi.siia.plamdep.utils.Log;

/**
 *
 * @author user
 */
public class Controller 
{
    private static List<String> algoritmosComparacion=new ArrayList<String>();
    private static List<String> algoritmosExtraccion=new ArrayList<String>();
    private static List<String[]>algoritmos=new ArrayList<String[]>(); 
    
    private static Ejecutor plataforma;
    private static List<AlgComparacionContainer> algscom=new ArrayList();
    private static List<AlgExtractorContainer> algsex=new ArrayList();	
    private static boolean loaded=false;
    private static SolicitudAnalisisJMS solicitud;
	public static void analizar(String sospechoso, boolean soloResumen,boolean web,boolean local,String algComparacion,String algExtraccion, List<String>fuentes, int nivelFrecuencia)
    {
		load();
		solicitud=new SolicitudAnalisisJMS();
		solicitud.setRutaArchivoSospechoso(sospechoso);
		solicitud.setBusquedaLocal(local);
		solicitud.setBusquedaWeb(web);
		solicitud.setCodigoAlgoritmoComparacion(algComparacion);
		solicitud.setCodigoAlgoritmoExtraccion(algExtraccion);
		solicitud.setFecha(new Date().toString());
		solicitud.setDescargarDocumento(!soloResumen);
		solicitud.setCodSolicitud(UUID.randomUUID().toString());
		solicitud.setFuentesLocales(fuentes);
		solicitud.setMailUsuario("");
		solicitud.setNumeroImg(0);
		solicitud.setNivelFrecuencia(nivelFrecuencia);
		Runnable analisis=new Runnable() {
			
			public void run() 
			{
				ResultAnalisis results=plataforma.analisisTextual(solicitud);
				Log.log(null, Log.MOD_GUI, Log.LEVEL_SUCESS, Controller.class, "Resultados de analisis");
				Container container=ReportesManager.getReporteContainer(results.getReporteData());
		        if(container!=null)
		        	ReportePanel.jInternalFrame1.setContentPane(container);
			}
		};
		Thread hilo=new Thread(analisis);
		hilo.start();

    }
	
	
	
	
	public static void load()
	{
		
		if(!loaded)
		{
			Log.log(null,Log.MOD_GUI,Log.LEVEL_LOAD, Controller.class, "Cargando configuracion algoritmos..");
			ArchivosManager archivo=new ArchivosManager("algoritmos.conf");
			String content=archivo.leerArchivo();
			String []lineas=content.split("\n");
			for(String lin:lineas)
			{
				Log.log(null,Log.MOD_GUI,Log.LEVEL_LOAD, Controller.class, "Lee:"+lin);
				String []reg=lin.split(";");
				if(reg.length==4)
					registrarAlgoritmo(reg[1], reg[3],reg[0],reg[2],false);
				
			}
			System.out.println("\n\n");
			
			Log.log(null,Log.MOD_GUI,Log.LEVEL_LOAD, Controller.class, "Inicializando Plataforma...");
			 plataforma=new Ejecutor(algscom,algsex );
			 loaded=true;
		}
		
	}
	
    public static void registrarAlgoritmo(String pathJar,String className,String nombre, String tipo,boolean actualizar)
    {
    	
    	Log.log(null, Log.MOD_GUI, Log.LEVEL_MSG, Controller.class, "Registrando algoritmo:"+nombre);
        if(tipo.equals("1"))
        {
          	   	 AlgComparacionContainer algComp=new AlgComparacionContainer();
          	     algComp.setClassName(className);
          	     algComp.setNombre(nombre);
          	     algComp.setRutaAlgoritmo(pathJar);
          	   	 algscom.add(algComp);
          	   	 algoritmosComparacion.add(nombre);
          	   	 
        }
        else
        {
	        	 AlgExtractorContainer algExt=new AlgExtractorContainer (); 
	        	 algExt.setNombre(nombre);
	        	 algExt.setClassName(className);
	        	 algExt.setRutaAlgoritmo(pathJar);
				 algsex.add(algExt);
        		 algoritmosExtraccion.add(nombre);
        }
        
        
        
         algoritmos.add(new String[]{nombre,pathJar,tipo.equals("1")?"Comparación":"Extracción",className});
         if(actualizar)
         {	 
	         ArchivosManager archivo=new ArchivosManager("algoritmos.conf");
	         archivo.borrar();
	         String content="";
	         for(String[] reg:algoritmos)
	         {
	        	 String tip=reg[2].startsWith("Com")?"1":"2";
	        	 content=content+reg[0]+";"+reg[1]+";"+tip+";"+reg[3]+"\n";
	         }	 
	 	   	 archivo.escribir(content);
         }
    }
    public static List<String[]> getAlgoritmosGuardados()
    {
    	load();
        return algoritmos;
    }

  
    public static List<String> getAlgoritmosComparacion() {
    	load();
    	return algoritmosComparacion;
    }

    public static List<String> getAlgoritmosExtraccion() {
    	load();
    	return algoritmosExtraccion;
    }
    
    public static void setConsolaOutput()
    {
    	Runnable r=new Runnable() {
			
			public void run() {
				ListenerLogguer listenner=new ListenerLogguer() {
					public void onLog(Exception error, String modulo, String level,Class className, String msg) {
						// TODO Auto-generated method stub
					}
					
					public void onLog(String msg) {
				    	Ventana.consola.txtConsola.append(msg+"]\n");				
					}
				};
		    	
		    	//Utils.logguerListeners.add(listenner);
				
			}
		};
    	
    	new Thread(r).start();

    	
    }
}
